#include    "motor-fan.h"

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
MotorFan::MotorFan(size_t idx, QObject *parent) : Device(parent)
  , idx(idx)
  , Mmax(611.5)
  , s_kr(0.08)
  , Un(380.0)
  , U_power(0.0)
  , omega0(157.08)
  , omega_nom(152.89)
  , kr(0.0154)
  , J(0.5)
  , is_no_ready(1.0)
{

}

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
MotorFan::~MotorFan()
{

}

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void MotorFan::setU_power(double value)
{
    QString sndName = QString("Motor_Fan%1").arg(idx);

    if (floor(value) > 0 && floor(U_power) == 0)
        emit soundPlay(sndName);

    if (floor(value) == 0 && floor(U_power) > 0)
        emit soundStop(sndName);


    U_power = value;
}

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
float MotorFan::isNoReady()
{
    return static_cast<float>(is_no_ready);
}

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void MotorFan::preStep(state_vector_t &Y, double t)
{
    Q_UNUSED(t)

    QString sndName = QString("Motor_Fan%1").arg(idx);

    is_no_ready = hs_n(Y[0] - 0.95 * omega_nom);
    //emit soundSetPitch(sndName, static_cast<float>(Y[0] / omega0));
}

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void MotorFan::ode_system(const state_vector_t &Y,
                          state_vector_t &dYdt,
                          double t)
{
    Q_UNUSED(t)

    // Расчитывает текущее скольжение ротора
    double s = 1 - Y[0] / omega0;

    // Рачитываем максимальный момент при данном напряжении питания
    double M_maximal = Mmax * pow(U_power / Un, 2.0);

    // Расчитываем электромагнитный момент (формула Клосса)
    double Ma = 2 * M_maximal / ( s / s_kr + s_kr / s );

    // Рассчитываем аэродинамический момент сопротивления
    double Mr = kr * Y[0] * Y[0] * Physics::sign(Y[0]);

    dYdt[0] = (Ma - Mr) / J;
}

//------------------------------------------------------------------------------
//
//------------------------------------------------------------------------------
void MotorFan::load_config(CfgReader &cfg)
{
    Q_UNUSED(cfg)
}
